1.7.1. ������ ������� � ��������� ��������

� ����� �� ����� ����������� � ��������� ���������� ������ �����. ��������, ����� ����������� ������ � ���� int array[25], �� ���� ������������ �� ������ ��������� ������ ��� �������� ���� ��������� �������, �� � ��� ��������� � ������ array, �������� �������� ����� ������ ������� �� ����� (��������) �������� �������, �.�. ��� ������ �������� ����������, � ������ � ��������� ������� �������������� ����� ��������� � ������ array. � ����� ������ ���������� ����� ��������� arrey �������� ����������, �������� ������� ����� ������������ � ����������, �� �������� ��� �������� ������.

��������� ��� ������� �������� ���������� ���������, ��������, ����� ������������:

         int arrey[25];
         int *ptr;
         ptr=array;

����� ��������� ptr ��������������� �� ����� ������� �������� ���c���, ������ ������������ ptr=arrey ����� �������� � ������������� ����� ptr=&arrey[0].

��� ������� � ��������� ������� ���������� ��� ��������� �������. ������ ������ ������ � �������������� ������� ��������� ��������� � ���������� �������, ��������, array[16]=3 ��� array[i+2]=7. ��� ����� ������� ������� ������������ ��� ���������, ������ ������ ��������� ����������� � ���������� ������. ���� �� ���� ��������� ������ ���� ����������, � ������ - ���������� ������ ����. ������������������ ������ ���� ��������� ����� ���� �����, �� � ���������� ������� ������������ ��������� ��������� ������. ������� ������ array[16] � 16[array] ����� �������������� � ���������� ������� ������� � ������� �����������. ��������� ������������ � ��������� ��������� �� ����������� ������ ���� ����������, ����������� �� �����-���� ������, ��� ����� ���� � ����������. � ��������� ����� ���������� ������������ ptr=array ������ � ������������� �������� ������� ����� �������� � ������� ��������� ptr � ����� ptr[16] ��� 16[ptr].

������ ������ ������� � ��������� ������� ������ � �������������� �������� ��������� � �������� ������������ � ����� *(array+16)=3 ��� *(array+i+2)=7. ��� ����� ������� ������� �������� ��������� ������ ������ ������������� �������� ������� ���� ����� ���� �������� ������� ��������� *(array+16) ��� *(16+array).

��� ���������� �� ���������� ������ ������ ���������� �� �������, �.�. ��������� ��������� ������������� � ���������. ��� ����������� �������� array[16] � 16[array] ������������� � *(array+16).

��� ������� � ���������� �������� ������� (�.�. � �������� � ������� ��������) ����� ������������ ������ �������� ��������� array ��� ptr. ����� �� ������������

       *array = 2;
       array[0] = 2;
       *(array+0) = 2;
       *ptr = 2;
       ptr[0] = 2;
       *(ptr+0) = 2;
����������� ���������� �������� ������� �������� 2, �� ������� ����� ���������� ������������ *array=2 � *ptr=2, ��� ��� � ��� �� ��������� ��������� �������� ��������.

1.7.2. ��������� �� ����������� �������

��������� �� ����������� ������� � ����� �� - ��� ������� ��������, �.�. ����� �������, ���������� ������� �������� �������. ��� ���������� ����� �������� � ������ ���������� ��������� ��������� ��������� ��������. �������� ��� ���������� ���������� ���������� ������� int arr2[4][3] � ������ ���������� ������� ��� �������� �������� ���������� arr, ������� �������� ���������� �� ������ �� ������� ����������. ��� ����� ������� �� ������� ���������� ���� ���������� ������. ������ �� ���� ������� ���������� �������� ����� ������� �� ���� ��������� ���� int, �, �������������, � ������ ���������� ���������� ������ ������� ��� �������� ������� �������� ����� ���� int, ������ �� ������� ������� �� ���� ���������. ����� ��������� ������ �������� �� ����� �� ���.3.

arr
arr[0]
arr[0][0]
arr[0][1]
arr[0][2]
arr[1]
arr[1][0]
arr[1][1]
arr[1][2]
arr[2]
arr[2][0]
arr[2][1]
arr[2][2]
arr[3]
arr[3][0]
arr[3][1]
arr[3][2]
���.3. ������������� ������ ��� ���������� �������.

����� �������, ���������� arr2[4][3] ��������� � ��������� ��� ������ �������: ��������� � ��������������� arr, ���������� ������ �� ������� ���������� � ���������� ������ �� ���������� ����� ���� int. ��� ������� � ���������� �������� ������������ �������� ��������� � ���������� arr. ������ � ��������� ������� ���������� �������������� � ��������� ������ ���������� ��������� � ����� arr2[2] ��� *(arr2+2). ��� ������� � ��������� ���������� ������� ����� ���� int ������ ���� ������������ ��� ��������� ��������� � ����� arr2[1][2] ��� ������������� �� *(*(arr2+1)+2) � (*(arr2+1))[2]. ������� ���������, ��� � ����� ������ ���������� ����� �� ��������� arr � ��������� arr[0], arr[1], arr[2], arr[3] �������� ����������� � �� �������� ������ �������� �� ����� ���������� ���������.

���������� ����������� ������� ���������� ���������� � ���������� float arr3[3][4][5] ��������� � ��������� ����� ������ ����������� ������� �� ����������� ����� ���� float ������ �� ������� ���������� �� ��� float, ������ �� ���� ���������� �� ������ ���������� �� float, � ��������� �� ������ �������� ���������� �� float.

��� ���������� ��������� ����������� �������� ��� ������������� � ������ ������ �� �������, �.�. ������� ����� ���������� ��������� ������, � ��������� - ������. ����� ������� ���� ����������� ���������� � ������ �������� ������������ �������, ��������� ����� ��� ���������� �������� � ������ ���� ��������� ���������.

��������, ��������� � �������� arr2[1][2] ����� ����������� � ������� ��������� ptr2, ������������ � ����� int *ptr2=arr2[0] ��� ��������� ptr2[1*4+2] (����� 1 � 2 ��� ������� ������������� ��������, � 4 ��� ����� ��������� � ������) ��� ��� ptr2[6]. �������, ��� ������ ������� ��������� arr2[6] ��������� ���������� ��� ��� ��������� � �������� 6 �� ����������.

��� ��������� � �������� arr3[2][3][4] �� ����������� ������� ���� ����o ������������ ���������, ��������� ��� float *ptr3=arr3[0][0] � ����� ��������� ���������� � ����� ptr3[3*2+4*3+4] ��� ptr3[22].

����� ��������� �������, ����������� ����� ����������� ������� � ���������� �������. � ������� ���������� ����� ���������� �������� � ������� �������, ������������ �������� - ��������� �� ���������, ���������� ������� ������������ ��������.

    struct INDEX {  int i,
                    int j,
                    int k }  min_index ;

    struct INDEX  * find_min (int *ptr1, int l, int m int n)
    {     int  min, i, j, k, ind;
          min=*ptr1;
          min_index.i=min_index.j=min_index.k=0;
          for (i=0; i*(ptr1+ind)
               {  min=*(ptr1+ind);
                  min_index.i=i;
                  min_index.j=j;
                  min_index.k=k;
               }
          }
          return &min_index;
    }

1.7.3. �������� � �����������

��� ����������� ����� ��������� ������� ��������: ��������� � ���������. ��� ���������� �������� ++ � -- �������� ��������� ������������� ��� ����������� �� ����� ����, �� ������� ��������� ������������ ���������.

������:

        int *ptr, a[10];
           ptr=&a[5];
           ptr++;      /* ����� ������ �������� a[6] */
           ptr--;      /* ����� ������ �������� a[5] */

� �������� ��������� �������� � ��������� ����� ����������� ��������� � �������� ���� int. ��� ���� ����������� �������� ����� ��������� �� �������� ���, � ��� �������� ����� �� ��������� ����� ��������� ������ ��� ������ ���������.

������:

        int *ptr1, *ptr2, a[10];
        int i=2;
           ptr1=a+(i+4);   /*  ����� ������ �������� a[6] */
           ptr2=ptr1-i;    /*  ����� ������ �������� a[4] */

� �������� ��������� ����� ����������� ��� ��������� �� ���� � ��� �� ���. ��������� ����� �������� ����� ��� int � ����� ����� ��������� ��������� ���� ����� ����������� � ����������, ������ ���� ������ ����� ������, �� ��������� ����� ������������� ��������.

������:

        int *ptr1, *ptr2, a[10];
        int i;
           ptr1=a+4;
           ptr2=a+9;
           i=ptr1-ptr2;  /*   ����� 5   */
           i=ptr2-ptr1;  /*   ����� -5  */

�������� ���� ���������� �� ���������� ���� ����� ���������� � ��������� ==, !=, <, <=, >, >= ��� ���� �������� ���������� ��������������� ������ ��� ����� �����, � ��������� ��������� ����� 0 (����) ��� 1 (������).

������:

      int *ptr1, *ptr2, a[10];
         ptr1=a+5;
         ptr2=a+7;
         if (prt1>ptr2) a[3]=4;

� ������ ������� �������� ptr1 ������ �������� ptr2 � ������� �������� a[3]=4 �� ����� ��������.

1.7.4. ������� ����������

� ����� �� �������� �������� ����� ����� ����� ���, �, � ���������, ����� ���� ����������� �� ����� ���. ���������� ��������� �������� � �������������� ����������.

��������� ���������� ����������

     int a[]={10,11,12,13,14,};
     int *p[]={a, a+1, a+2, a+2, a+3, a+4};
     int **pp=p;

��������� ����������� �������, �������������� �� ����� �� ���.4.

  pp
  p
. . . . .
  a
  11
  12
  13
  14
  15
���.4. ����� ���������� ���������� ��� ����������.

��� ���������� �������� pp-p ������� ������� ��������, ��� ��� ������ pp � p ����� � ��������� �� ��������� ������� ������� ����������, ���������� � ���������� p ( �� ������� p[0]).

����� ���������� �������� pp+=2 ����� ��������� � ������ ���, ������������ �� ���.5.

  pp
  p
. . . . .
  a
  10
  11
  12
  13
  14
���.5. ����� ���������� ���������� ����� ���������� �������� pp+=2.

����������� ���������� ��������� pp-p ����� 2, ��� ��� �������� pp ���� ����� �������� �������� ������� p. ������ *pp-a ���� ���� �������� 2, ��� ��� ��������� *pp ���� ����� �������� �������� ������� a, � ��������� a ���� ����� ���������� �������� ������� a. ��� ��������� � ������� ������ **pp ������� 12 - ��� �������� �������� �������� ������� a. ������ *pp++ ���� �������� ���������� �������� ������� p �.�. ����� ���������� �������� ������� a.

���� �������, ��� pp=p, �� ��������� *++pp ��� �������� ������� �������� ������� a (�.�. �������� 11), �������� ++*pp ������� ���������� ��������� p[0], ����� �������, ��� �� ������ ������ �������� ������ �������� a[1].

������� ��������� ������������ �������. �������� ��������� *(++(*pp)) ����� ������� �� ��������� ��������: *pp ���� �������� ���������� �������� ������� p[0], ����� ��� �������� ��������������� ++(*p) � ���������� ���� ��������� p[0] ������ ����� �������� ������ �������� a[1], � ��������� �������� ��� ������� �������� �� ����������� ������, �.�. �������� 11.

� ���������� �������� ��� ����������� ���������� ������, ���������� ������ ������ � ����������� �������� � �����������. ��������� ���������� ����������

     int a[3][3]={  { 11,12,13 },
                    { 21,22,23 },
                    { 31,32,33 }   };
     int *pa[3]={ a,a[1],a[2] };
     int *p=a[0];

��������� � ��������� ������� �������������� �� ����� �� ���.6.


���.6. ����� ���������� ���������� �� ��������� ������.

�������� ���� ����� ������ � �������� a[0][0] �������� �� ���������� a, p, pa ��� ������ ��������� ������: a[0][0], *a, **a[0], *p, **pa, *p[0].

���������� ������ ������ � �������������� ����� ��������. ���������� ����������

     char *c[]={ "abs", "dx", "yes", "no" };
     char **cp[]={ c+3, c+2 , c+1 , c };
     char ***cpp=cp;

����� ���������� ������ �������������� �� ���.7.


���.7. ����� ���������� ���������� �� ������.

1.7.5. ������������ ���������� ��������

��� ������������ ������������� ������ ��� �������� ������� ������� ��������������� ��������� � ����������� ��� �������� ��� ������ ������� calloc. ���������� ������ a[10] �� ��������� ���� float ����� ������� ��������� �������

      float *a;
      a=(float*)(calloc(10,sizeof(float));

��� �������� ���������� ������� ������� ����� ������������ ������ ��� ������� ���������� �� ���������� �������, � ����� ������������ ������ ��� ���������� ��������. �����, ��������, ��������� ������� ������ a[n][m], ��� ����� ������� ��� ������ ���������� ��������� ���������:

   #include 
   main ()
       {  double **a;
          int n,m,i;
          scanf("%d %d",&n,&m);
          a=(double **)calloc(m,sizeof(double *));
          for (i=0; i<=m; i++)
              a[i]=(double *)calloc(n,sizeof(double));
         . . . . . . . . . . . .
         }

����������� ������� ����� ������������ ������ � ��� ����������� ������� �������� n,m,l. ������� ������ �������, ��� �������� ��� ����������� ���������� ��������� ������ ������� ����������� ��� ������ ������� free.

   #include 
   main ()
       {  long ***a;
          int n,m,l,i,j;
          scanf("%d %d %d",&n,&m,&l);
          /* --------  ������������� ������ -------- */
          a=(long ***)calloc(m,sizeof(long **));
          for (i=0; i<=m; i++)
             {    a[i]=(long **)calloc(n,sizeof(long *));
                  for (j=0; i<=l; j++)
                  a[i][j]=(long *)calloc(l,sizeof(long));
              }
         . . . . . . . . . . . .
          /* --------- ������������ ������ ----------*/
          for (i=0; i<=m; i++)
              {   for (j=0; j<=l; j++)
                  free (a[i][j]);
                  free (a[i]);
               }
           free (a);
         }

���������� ��� ���� ���������� ������, � ������� ������ ��� �������� �������������� � ���������� �������, � ������������ � ����������. � ����� ������ � ���������� ������� ��������� ���������� ���������, ������� ����� ��������� ������ ���������� ��� �������� ������.

     ������:
   #include 
   main()
   {   int vvod(double ***, long **);
       double **a;     /*  ��������� ��� �������  a[n][m]   */
       long *b;        /*  ��������� ��� �������  b[n]      */
       vvod (&a,&b);
        ..   /* � ������� vvod ���������� ������ ����������, */
        ..   /* � �� �� ��������                             */
        ..
    }
    int vvod(double ***a, long **b)
    {   int n,m,i,j;
        scanf (" %d %d ",&n,&m);
        *a=(double **)calloc(n,sizeof(double *));
        *b=(long *)calloc(n,sizeof(long));
        for (i=0; i<=n; i++)
            *a[i]=(double *)calloc(m,sizeof(double));
        .....
     }

������� ����� �� ��������������, ��� ��������� �� ������ �� ����������� ������ ���������� �� ��������� ������� ���������� �������. �� ����� ���� ������� ���, ��� ��������� ������� ����� ����� ������ �������� �� ����, ������ �� ����� ���� ��� ������������� ��� � �������������.

������:

    #include 
    int main()
    {  float *q, **b;
       int i, j, k, n, m;
       scanf("%d %d",&n,&m);
       q=(float *)calloc(m,sizeof(float));
    /* ������ ��������� q ���������� �� ������ �������    */
       q[0]=22.3;
       q-=5;
    /* ������ ��������� ������� ������� ����� ������ 5,   */
    /* � �������� ������� ������ n-5                      */
       q[5]=1.5;
    /* ����� ������� �� �������� � �����������������      */
    /* ������� � ������ � ��������� ��������� �������     */
       q[6]=2.5;   /*  -  ��� ������ �������              */
       q[7]=3.5;   /*  -  ��� ������ �������              */
       q+=5;
    /* ������ ��������� ������� ����� ����� ������ 0,     */
    /* � �������� ��������� q[0], q[1], q[2] �����        */
    /* �������������� 1.5, 2.5, 3.5                       */
       q+=2;
    /* ������ ��������� ������� ����� ������ -2,          */
    /* ��������� -1, ����� 0 � �.�. �� �������            */
       q[-2]=8.2;
       q[-1]=4.5;
       q-=2;
    /* ���������� ��������� ����������, ��� ������        */
    /* �������� ������� q[0], q[1], q[2], �����           */
    /* �������� 8.2, 4.5, 3.5                             */
       q--;
    /* ����� ������� ���������� .                         */
    /* ��� ������������ ������� ������ � ������� �������� */
    /* ������ q ������������ ������� free(q), �� ��������� */
    /* �������� ��������� q �������, �� ����������     */
    /* ������� free(q) �������� � ��������������� ������������. */
    /* ��� ����������� ���������� ���� �������    */
    /* ��������� q ������ ���� ��������� � �������������� */
    /* ���������                                          */
       free(++q);
    /* ���������� ����������� ��������� ���������� �      */
    /* ������������ ������ ��� ���������� �������         */
       b=(float **)calloc(m,sizeof(float *));
       for (i=0; i < m; i++)
           b[i]=(float *)calloc(n,sizeof(float));
    /* ����� ������������� ������ ��������� ���������      */
    /* ������� ����� ������� b[0][0]                       */
    /* �������� ����� �������� ���, ����� ���������        */
    /* ��������� ���� ������� b[1][1]                      */
       for (i=0; i < m ; i++) --b[i];
       b--;
    /* ������ �������� ������� �������� ������� ����� ���  */
    /* ��������                                            */
       for (i=1; i<=m; i++)
           for (j=1; j<=n; j++)
               b[i][j]=(float)(i+j);
    /* �������� �������� �� ��������� �������� ���������   */
    /* ������ i � j, �� ���������� � 1 � �� � 0            */
    /* ����������� � ������� ����������                    */
       for (i=1; i<=m; i++) ++b[i];
       b++;
    /* �������� ������������ ������                        */
       for (i=0; i < m; i++)  free(b[i]);
       free(b);
       ...
       ...
       return 0;
    }

� �������� ���������� ������� ���������� ������������ ������������� ������ ��� ������� ���������� �� �������, ������� ���� ������� �������� ���� double � ������������ �������� ���� double.

������:

   #include 
   #include 
    double cos(double);
    double sin(double);
    double tan(double);
   int main()
   { double (*(*masfun))(double);
     double x=0.5, y;
     int i;
     masfun=(double(*(*))(double))
              calloc(3,sizeof(double(*(*))(double)));
     masfun[0]=cos;
     masfun[1]=sin;
     masfun[2]=tan;
     for (i=0; i<3; i++);
     {  y=masfun[i](x);
        printf("\n x=%g  y=%g",x,y);
     }
     return 0;
   }

[ ����� | ������ ]